iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

Easy to learn Algorithm系列 第 4

「Day4」資料結構I

  • 分享至 

  • xImage
  •  

資料結構

一想到資料結構就感到很複雜的一些觀念
最早使用電腦的主因是要用來儲存及管理一些資料,這也是資料結構觀念的由來。當我們要求電腦解決問題時,必須以電腦了解的模式來描述問題,資料結構是資料的表示法,也就是電腦中儲存資料的方法。

認識資料結構

資料結構就是資料進入電腦化處理的一套完美邏輯。像程式設計師必須用資料結構來進行資料的新增、刪除、修改、儲存等動作,如果在選擇資料結構時做了錯的選擇,那你整個程式會變得沒效率或者變慢,甚至選錯資料型態那真的是會埋了更大的雷。

例如:圖書館會建立所有書的資料,管理人員會依照各個不同的書做種類分類,如年齡分級、書籍類型、作者或主題。分類好把檔案存起來日後有人要來借書時,只要查詢書籍類型作者名稱這樣,即可快速找出所需的書,而這些儲存的分類就是資料結構概念的一種。

資料與資訊

先了解一下資料(Data)與資訊(Information)的定義。

資料是指為基處理的文字、數字、符號、圖形等等。還可以再分為兩大類,

  • 數值資料(Numeric Data):就是一般的數值,可用運算子來做運算

  • 文數資料(Alphanumeric Data):像是非數值資料,像是我們看到的地址身分證號碼等等

資訊是將大量的資料,經過有系統的整理、分析、篩選處理,具有參考價值和可用性。

資料結構主要是表示資料在電腦記憶體中所儲存的位置和模式,可分為三種型態:

  • 基本資料型態(Primitive Data Type)

無法以其他型態定義的資料型態,也稱為純量資料型態,程式語言都會提供基本資料,例如:Rust中的基本資料型態,包括整數、浮點數、布林、字符、陣列等等。

  • 結構化資料型態(Structured Data Type)

也稱為虛擬資料型態,比基本資料型態更高一層,例如:結構、列舉等等。

  • 抽象話資料型態(Abstract Data Type)

對一種資料型態,可將其看成是一種值的集合,以及在這些值上所作的運算與本身代表屬性成的集合。抽象資料型態所代表便是定義這種資料型態所具備的數學關係。

資料結構的種類

資料結構可透過程式語言提供有效的型別、參照及其他操作。我們知道一個程式能否快速而有效率的完成任務,取決是否選對了資料結構,而程式是否能清楚而正確的把問題解決,取決於演算法。

資料結構加上演算法等於有效率、可執行的程式。

不同種類的資料結構適合不同種類的應用,用適當的資料結構可讓演算法發揮最大效能。接下來會介紹常見的資料結構。

陣列(Array)

陣列結構是一排緊密的可數記憶體,並提供能夠直接存取單一資料計算方法。
像是每戶的信箱,每個信箱有地址,路名就是名稱,信箱號碼就是索引,可以依照信件上的住址投到信箱,陣列的名稱是表示一塊緊密相鄰記憶體的起始位置,而陣列的索引功能則是用來表示從此記憶體起始位置的第幾個區塊。

陣列的使用可分為一維陣列、二維陣列與多維陣列等等

二維陣列

二維陣列可視為一維陣列的延伸,都是處理相同型態資料,差別只在維度的宣告。

例如:一個含有x * y個元素的二維陣列,x代表列數,y代表行數

在Rust二維宣告格式:

資料型態 二維陣列名 [列大小] [行大小];

// 4X4
let mut arr: [[32; 4]; 4]

這邊是用[]括住每一列的初始值,並以;區隔每個陣列元素

// 2X3
let mut arr: [[i32; 3]; 2] = [[0, 1, 2], [3, 4, 5]];

| | 欄索引[0] | 欄索引[1] | 欄索引[2] |
| -------- | -------- | -------- |
| 列索引[0] | 0 | 1 | 2 |
| 列索引[1] | 3 | 4 | 5 |

三維陣列

三維跟二維一樣,可視為是一維陣列的延伸,陣列為三維陣列時,可看作一個立方體,像是魔術方塊一樣。

上圖就像是arr[2][3][4]三維陣列成魔術方塊。

fn main() {
    // 宣告一個3x3x3的整數三維陣列
    let arr: [[[i32; 3]; 3]; 3] = [
        [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
        [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
        [[19, 20, 21], [22, 23, 24], [25, 26, 27]],
    ];

    // 三維陣列
    for x in 0..3 {
        for y in 0..3 {
            for z in 0..3 {
                print!("{} ", arr[x][y][z]);
            }
            println!();
        }
        println!();
    }
}

會印出

1 2 3
4 5 6
7 8 9

10 11 12
13 14 15
16 17 18

19 20 21
22 23 24
25 26 27

今天先介紹資料結構概念以及陣列的基本,陣列在開發是非常重要且常見的,很常在開發中使用到它,所以這邊先來了解它,後面會再介紹其他資料結構的種類。

目前應該不會太難吧㋡㋡!!

要是哪裡理解上還是邏輯上有錯請各位大大指正,感謝 𓁏𓁏𓁏。


上一篇
「Day3」最常見演算法II
下一篇
「Day5」資料結構II
系列文
Easy to learn Algorithm30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言